--[[
name: eval函数实现封装
]]

-- 定义 eval 函数
function eval(code, env, ...)
    -- 使用 loadstring 函数创建一个函数
    local chunk, err = loadstring("return function(args) " .. code .. " end")
    if not chunk then
        error(err)
    end
    -- 设置环境
    setfenv(chunk, env)
    -- 调用生成的函数，并传递参数
    local func = chunk()
    return func({...})
end

-- 定义外部变量
local externalData = {
    tmp = 20,
    hum = 30
}

_G.ledValue = 0

-- 定义函数代码
local functionCode = [[
    local value = (data.tmp + data.hum) / 2
    log.info("函数里 ledValue ", ledValue)
    if ledValue == 1 then
        log.info("修改为1")
        ledValue = 0
        ChangeValue("ledValue", 0)
        log.info("修改为后 ", ledValue)
    else
        ledValue = 1
        ChangeValue("ledValue", 1)
    end
    led(ledValue)
    log.info("开始222 ")
    if value > 34 then
        return 1
    else
        return 2
    end
]]

function ChangeValue(key, value)
    _G[key] = value
end

-- 模拟 sys 模块的函数
local sys = {}
function sys.wait(ms)
    -- 模拟等待，实际可能需要实现
end
function sys.taskInit(func)
    func()
end

-- 模拟 log 和 led 函数
local log = {}
function log.info(msg)
    print(msg)
end
function led(value)
    print("LED value set to", value)
end

-- 主任务
sys.taskInit(function()
    sys.wait(3000)
    while true do
        sys.wait(3000)
        log.info(" ------ ....开始执行中.... ------ ")

        -- 测试 eval 函数
        local result = eval(functionCode, {
            data = externalData,
            led = led,
            log = log,
            sys = sys,
            ledValue = _G.ledValue,
            _G = _G,
            ChangeValue = ChangeValue
        })
        log.info("操作后  ledValue ", _G.ledValue)
    end
end)